﻿Imports System.IO
Imports System.Drawing

Public Class fpg_file
    'variables privadas

    'paleta de colores
    Private Structure paletteRGB
        Public R As Integer
        Public G As Integer
        Public B As Integer
    End Structure
    'datos imagen
    Private Structure imagen
        Public codigo As Integer
        Public width As Integer
        Public height As Integer
        Public image As Bitmap
    End Structure
    Private palette(255) As paletteRGB
    Private imagenes(255) As imagen

    'variables publicas
    Public num_imagenes As Integer


    'Metodos publicos
    '--------------------------------------
    'Cargar archivo fpg
    Public Function load_fpg(ByVal filename As String) As Integer
        Dim magic_header() As Byte = {&H66, &H70, &H67}
        Dim archivo As New FileStream(filename, FileMode.Open)
        Dim data As New BinaryReader(archivo)
        Dim pixel_color As Integer

        'comprobamos cabecera
        If data.ReadByte <> magic_header(0) Or data.ReadByte <> magic_header(1) Or data.ReadByte <> magic_header(2) Then
            'If False Then
            data.Dispose()
            archivo.Close()
            load_fpg = 0
        Else
            'descartamos el resto de cabecera(de momento ni archivos comprimidos ni nada que no sea 8bits)
            data.ReadBytes(5)
            'leemos la paleta de colores (en bennu se multiplica por 4 el color ¿media luminosidad?)
            For i = 0 To 255
                palette(i) = New paletteRGB
                palette(i).R = data.ReadByte * 4
                palette(i).G = data.ReadByte * 4
                palette(i).B = data.ReadByte * 4
            Next
            'leemos las imagenes del archivo
            data.ReadBytes(576) 'nos saltamos las gammas (vacias)

            num_imagenes = 0
            Do Until data.PeekChar = -1 'recorrer hasta el fin del archivo
                imagenes(num_imagenes) = New imagen
                imagenes(num_imagenes).codigo = data.ReadUInt32
                data.ReadUInt32() 'reg size
                data.ReadBytes(32) 'name
                data.ReadBytes(12) 'fp_name
                imagenes(num_imagenes).width = data.ReadUInt32
                imagenes(num_imagenes).height = data.ReadUInt32
                data.ReadInt32() 'flags

                'dibujamos el bitmap
                imagenes(num_imagenes).image = New Bitmap(imagenes(num_imagenes).width, imagenes(num_imagenes).height)

                For y = 0 To imagenes(num_imagenes).height - 1
                    For x = 0 To imagenes(num_imagenes).width - 1
                        pixel_color = data.ReadByte
                        imagenes(num_imagenes).image.SetPixel(x, y, Color.FromArgb(get_pal_r(pixel_color), get_pal_g(pixel_color), get_pal_b(pixel_color)))
                    Next
                Next
                num_imagenes += 1
            Loop

            data.Dispose()
            archivo.Close()

            load_fpg = 1
        End If

    End Function
    'devolver componente r de un color de la paleta
    Public Function get_pal_r(ByVal num_color As Integer) As Integer
        get_pal_r = palette(num_color).R
    End Function
    'devolver componente r de un color de la paleta
    Public Function get_pal_g(ByVal num_color As Integer) As Integer
        get_pal_g = palette(num_color).G
    End Function
    'devolver componente r de un color de la paleta
    Public Function get_pal_b(ByVal num_color As Integer) As Integer
        get_pal_b = palette(num_color).B
    End Function
    'obtener el bitmap del numero de imagen del fpg
    Public Function get_image(ByVal num_imagen As Integer) As Bitmap
        If num_imagen = -1 Then num_imagen = 0
        get_image = imagenes(num_imagen).image
    End Function
    'obtener el ancho de un grafico
    Public Function get_image_width(ByVal num_imagen As Integer) As Integer
        get_image_width = imagenes(num_imagen).width
    End Function
    'obtener el alto de un grafico
    Public Function get_image_height(ByVal num_imagen As Integer) As Integer
        get_image_height = imagenes(num_imagen).height
    End Function
End Class
